package br.senai.sc.controller.crud;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import br.senai.sc.model.Amostra;
import br.senai.sc.model.PontoColeta;

/**
 * Possui métodos para gerar relatórios de {@link Amostra}.
 * 
 * @author Tiago
 */
public class RelatorioAmostra implements Serializable {

	private static final long serialVersionUID = 1L;

	@PersistenceContext
	private EntityManager em;

	/**
	 * TODO implementar
	 * 
	 * @param pontoColeta
	 * @param dtInicial
	 * @param dtFinal
	 * @return Lista de {@link Amostra} especificado dentro do intervalo de data
	 *         informado de um {@link PontoColeta}.
	 * @throws IllegalArgumentException
	 *             Lançada caso algum argumento obrigatório não foi informado.
	 */
	public List<Amostra> amostras(PontoColeta pontoColeta, Date dtInicial,
			Date dtFinal) {

		if ((pontoColeta == null) || (pontoColeta.getIdPontoColeta() == null)
				|| (dtInicial == null) || (dtFinal == null)) {
			throw new IllegalArgumentException(
					"Informando null em atributos necessários para gerar relatório");
		}

		List retorno = em
				.createQuery(
						"SELECT a FROM Amostra a WHERE a.data BETWEEN :dtInicial AND :dtFinal AND a.pontoColeta = :pontoColeta")
				.setParameter("dtInicial", dtInicial)
				.setParameter("dtFinal", dtFinal)
				.setParameter("pontoColeta", pontoColeta).getResultList();

		return retorno;
	}
}
